<?php
/**
 * 描述：在原有的PDO对象基础上进行扩展，让PDO可以接受配置参数，使用更加方便。
 * @author WangYang <3331137@qq.com>
 */
final class EPDO extends PDO
{
      /**
       * 描述：EPDO的构造函数，通过“EPDO配置关联数组”配置EPDO对象。
       * @access public
       * @param  array  require 配置数组
       * =>DSN             string require  PDO连接所需的DSN串
       * =>User            string require  登录用户名
       * =>Password        string optional 密码
       * =>Options         array  optional 数据库的个性化设置
       * =>Attribute       array  optional "PDO属性"配置关联数组
       * =>ExtendAttribute array  optional "EPDO属性"配置关联数组
       * （
       *      =>QuoteFix array optional default:NULL 数据库的保留字前后缀关联数组
       *      (
       *           'PreFix' string optional NULL
       *           'Suffix' string optional NULL
       *      )
       * ）
       */
    public function __Construct($config)
	{
            $this->TestConfig($config);
            
            parent::__construct($config['DSN'],$config['User'],$config['Password'],$config['Options']);

            foreach($config['Attribute'] as $key=>$value){
                  $this->SetAttribute($key,$value);
            }
	}          

      /**
       * 描述：检查构造函数的配置数组是不是符合基本要求。
       * @access public 
       * @param  array  require $config
       * @return void
       */
      public function TestConfig($config)
      {
            if(!is_array($config)) throw new Exception('class.EPDO.Construct：EPDO配置不是数组');
            if(!$config['DSN']) throw new Exception('class.EPDO.Construct：EPDO配置没有指定DSN');
            if(!$config['User']) throw new Exception('class.EPDO.Construct：EPDO配置没有指定登录用户名');            
      }

      public static function BindSTMT(&$sth,&$params)
      {
            $isAssoc=array_keys($params)!==range(0,count($params)-1);         //关联数组与非关联数组绑定方法不一样。? : 区别
            $values=array();
            {
                  if($isAssoc)
                  {
                        foreach($params as $field=>$value)
                        {
                              $isSpecial=(gettype($value)=='array') ? TRUE:FALSE;
                              {
                                    $values[$field]=$isSpecial ? $value[0]:$value;
                                    $type=$isSpecial ? (count($value)>=2 ? $value[1]:PDO::PARAM_STR):PDO::PARAM_STR;
                                    $length=$isSpecial ?(count($value)>=3 ? $value[2]:NULL ):NULL;
                                    $options=$isSpecial ? (count($value)>=4 ? $value[3]:NULL ):NULL;
                              }
                              $sth->BindParam(':'.$field,$values[$field],$type,$length,$options);
                        }
                  }
                  else
                  {
                        foreach($params as $key=>$value)
                        {
                              $isSpecial=(gettype($value)=='array') ? TRUE:FALSE;
                              {
                                    $values[$key]=$isSpecial ? $value[0]:$value;
                                    $type=$isSpecial ? (count($value)>=2 ? $value[1]:PDO::PARAM_STR):PDO::PARAM_STR;
                                    $length=$isSpecial ?(count($value)>=3 ? $value[2]:NULL ):NULL;
                                    $options=$isSpecial ? (count($value)>=4 ? $value[3]:NULL ):NULL;
                              }
                              $sth->BindParam($key+1,$values[$key],$type,$length,$options);
                        }
                  }
            }
            unset($value);
      }
}
?>